﻿
namespace MIAP.Negocio
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using MIAP.DataAccess.Interfaces;
    using MIAP.Entidades;

    /// <summary>
    /// Clase de negocio para las operaciones de Alta Usuario.
    /// </summary>
    public class AltaUsuariosNegocio
    {
        #region Campos

        /// <summary>
        /// Instancia para el acceso a datos de Administración de Proyectos.
        /// </summary>
        private readonly IUsuarioDao daoUsuarios;

        /// <summary>
        /// Instancia para el acceso a datos de Archivos.
        /// </summary>
        private readonly IArchivosDao daoArchivos;

        #endregion

        #region Constructor

        /// <summary>
        /// Inicializa una instancia de <see cref="AltaUsuariosNegocio"/>
        /// </summary>
        public AltaUsuariosNegocio()
        {
            this.daoUsuarios = DataAccessFactory.Instance.CreateUsuariosDao();
            this.daoArchivos = DataAccessFactory.Instance.CreateArchivosDao();
        }

        #endregion

        /// <summary>
        /// Obtiene todos los usuarios del active directory que no han sido dados de alta en el sitema.
        /// </summary>
        /// <returns>Lista de los usuarios que aún no han sido dados de alta.</returns>
        public List<UsuarioInfo> GetUsuariosToEnlist()
        {
            return this.daoUsuarios.GetUsuariosToEnlist().ToList();
        }
        /// <summary>
        /// Agrega un nuevo usuario a la tabla de usuarios sin perfiles
        /// </summary>
        /// <param name="usuario">Usuario que será agregado.</param>
        /// <param name="user">Usuario que ejecuta la operación.</param>
        public void AddNewSingleUsuario(UsuarioInfo usuario, string user)
        {
            this.daoUsuarios.AddNewSingleUsuario(usuario,user);
        }

        /// <summary>
        /// Obtiene el usuario dado un Id específico.
        /// </summary>
        /// <param name="idUsuario">Id del usuario a obtener</param>
        /// <returns>Usuario coincidente con el id del usuario.</returns>
        public UsuarioInfo GetUsuarioById(int idUsuario)
        {
            return this.daoUsuarios.GetUsuarioById(idUsuario);
        }

        /// <summary>
        /// Obtiene el usuario del AD dado un Id del AD específico.
        /// </summary>
        /// <param name="idClave">Id del usuario a obtener</param>
        /// <returns>Usuario coincidente con el id del usuario.</returns>
        public UsuarioInfo GetUsuarioADByClave(int idClave)
        {
            return this.daoUsuarios.GetUsuarioADByClave(idClave);
        }
        
        /// <summary>
        /// Modifica la información del usuario.
        /// </summary>
        /// <param name="usuario">Usuario que será modificado.</param>
        /// <param name="listArchivos">Lista de archivos relacionados al usuario.</param>
        /// <param name="user">Usuario que ejecuta la operación.</param>
        public void EditUsuario(UsuarioInfo usuario, string user)
        {
            this.EditUsuario(usuario, user);
        }
    }
}
